再帰関数 超むずい。
ファミマの焼き鳥 超うまい。(食べたことないけど)
というわけで、再帰関数について勉強中であります。
今まで、縁がなかったんですよ。作る必要なかったっていうか。
しかし、ディープラーニング系だと結構出てきますよね!
こちらのサイト拝見して勉強させて頂きました。m(_ _)m
http://www.geocities.jp/m_hiroi/light/pyalgo01.html
とりあえず、ここに載っているフィボナッチ関数の簡単なバージョンを作ってみます。
def fibo(n):
print('nだよ %s' %n)
if n == 0 or n == 1: return 1
return fibo(n - 1) + n
v=fibo(5)
print('vだよ %s' %v)
結果は次の通り。
nだよ 5 nだよ 4 nだよ 3 nだよ 2 nだよ 1 vだよ 15
再帰関数初心者としては、return が最後しか返ってこないのが不思議。
弊社の俊英 Nくんが教えてくれたのですが、
「まずは再帰の中をぐるぐるやって、終わった時にreturnします。」
だそうです。
もうちょっと飛躍させて、次のようなのを作ります。
print('はじまり')
array = [1,2,3]
def search(s):
print("sだよ %s" %s)
if s not in array:
v = s + 10
print("途中で帰るv %s" % v)
return -v
next_s = s + 1
v = search(next_s)
print('最後まで行ったv:%s s:%s' %(v,s))
return -v
for x in range(5):
value = search(x)
print("vだよ %s" %value)
print('おわり')
出力は次の通り。
はじまり sだよ 0 途中で帰るv 10 vだよ -10 sだよ 1 sだよ 2 sだよ 3 sだよ 4 途中で帰るv 14 最後まで行ったv:-14 s:3 最後まで行ったv:14 s:2 最後まで行ったv:-14 s:1 vだよ 14 sだよ 2 sだよ 3 sだよ 4 途中で帰るv 14 最後まで行ったv:-14 s:3 最後まで行ったv:14 s:2 vだよ -14 sだよ 3 sだよ 4 途中で帰るv 14 最後まで行ったv:-14 s:3 vだよ 14 sだよ 4 途中で帰るv 14 vだよ -14 おわり
最後まで行ったv というのが結局returnされないのは、さっきのくだりで学習したのですが、初心者にとって解せぬポイントは
最後まで行ったv:-14 s:3 最後まで行ったv:14 s:2 最後まで行ったv:-14 s:1
なんですよ。
なんで、これ、sの順番が逆なの??
sは 1,2,3 の順じゃないの??
これも、弊社の俊英かつサイキッカーのN君が教えてくれました。
「再帰関数は、枝分かれしていって評価するんですが、最後の枝までいったら逆順に評価していくんです。」
エッッ そうなんだ。( ゚Д゚) むずかしー!!
サイキッカーへの道は遠いようです。
